As the number of processing cores per computer increases, concurrent computing is becoming more and more prevalent. In order to make the programming of concurrent computers easier, memory associated with the cores is shared. However, sharing memory poses problems, such as different cores or threads simultaneously attempting to access the same location in memory. Moreover, ensuring that separate threads do not update the same location in memory at the same time is complicated and error prone.